package com.mezz.bones.im.common.domain.user;

import cn.hutool.core.util.StrUtil;
import com.mezz.bones.im.common.enums.DeviceEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import java.io.Serializable;
import java.util.Objects;

/**
 * @Author: zhuang
 * @Date: 2024/12/5 17:15
 * @Description:
 *
 * 一个 具体的ImUserConnectInfo 映射到一个具体的 连接
 * userId + clientType + imei(可能为空 默认为non) 确定一个设备信息 一个设备绑定一个channel连接
 * 1个用户可能存在多个连接
 * **/

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@ApiModel("用户设备连接信息")
public class ImUserConnectInfo implements Serializable {

    @ApiModelProperty("用户ID")
    private String userId;

    @ApiModelProperty("用户端类型 user-用户 srm-供应商 saas-平台端")
    private String userType;

    /**
     * @see DeviceEnum
     */
    @ApiModelProperty("客户端设备类型 默认服务端主动发起推送消息")
    private String deviceType = "admin";

    @ApiModelProperty("客户端设备号信息")
    private String imei;

    @ApiModelProperty("客户端IP信息")
    private String ip;

    /**
     * 表示连接的唯一标识  redis存储用
     * @return
     */
    public String connectKey(){
        return StrUtil.concat(true,this.userId,":", deviceType,":",imei);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ImUserConnectInfo that = (ImUserConnectInfo) o;
        return Objects.equals(userId, that.userId) && Objects.equals(deviceType, that.deviceType) && Objects.equals(imei, that.imei);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId, deviceType, imei);
    }
}
